package ar.uba.is2.ec.matem.dao.impl;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import ar.uba.is2.common.mensaje.contenido.Identificador;
import ar.uba.is2.common.utils.HibernateUtil;
import ar.uba.is2.ec.matem.dao.ResultadoDeModeloDao;
import ar.uba.is2.ec.matem.datos.ResultadoDeModelo;

/**
 * Toma un idModelo y un nombreEC y devuelve los resultados de modelo con el
 * mayor id (podría ser timestamp) para esa EC y ese idModelo.
 * 
 * @author Guillermo
 * 
 */
public class ResultadoDeModeloDaoImpl implements ResultadoDeModeloDao {

	public void guardar(ResultadoDeModelo resultado) {
		Session session = null;
		try {
			session = HibernateUtil.getSession();
			Transaction tx = session.beginTransaction();

			session.save(resultado);

			tx.commit();
			session.flush();
		} finally {
			if (session != null) {
				session.close();
			}
		}
	}

	@SuppressWarnings("unchecked")
	@Override
	public ResultadoDeModelo obtenerResultado(Identificador identificador) {
		Session session = null;
		try {
			session = HibernateUtil.getSession();
			session.beginTransaction();

			String query = "from ResultadoDeModelo r where r.coordenada.latitud = :latitud and r.coordenada.longitud = :longitud and r.idModelo = :idModelo order by r.timestamp desc";

			Query q = session.createQuery(query).setDouble("latitud",
					identificador.getCoordenada().getLatitud()).setDouble(
					"longitud", identificador.getCoordenada().getLongitud())
					.setString("idModelo",
							identificador.getValorIdentificador());

			List<ResultadoDeModelo> resultados = q.list();

			session.flush();

			if (resultados.size() > 0) {
				return resultados.iterator().next();
			} else {
				return null;
			}
		} finally {
			if (session != null) {
				session.close();
			}
		}
	}

}
